package com.ztesoft.book.admin.controller.quartz;

import com.ztesoft.book.admin.annotation.SysLog;
import com.ztesoft.book.admin.config.schedule.service.ScheduleJobService;
import com.ztesoft.book.common.utils.Result;
import com.ztesoft.book.common.utils.query.PageBO;
import com.ztesoft.book.common.utils.validator.ValidatorUtils;
import com.ztesoft.book.core.quartz.schedulejob.dto.ScheduleJobDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @Description: 定时任务
 * @Author: YangFan
 * @Date: 2021-03-22 14:32
 */
@Api(tags = "定时任务调度器")
@RestController
@RequestMapping("/quartz/schedule")
public class ScheduleJobController {

    @Autowired
    private ScheduleJobService scheduleJobService;


    /**
     * 方法功能描述:
     * < 定时任务列表 >
     *
     * @param params 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:04
     */
    @ApiOperation(value = "查看所有定时任务", notes = "  \n" +
            "返回值解释:  \n" +
            "code: 0-为成功，1-为失败  \n" +
            "msg: 提示的信息  \n" +
            "data: 返回的数据，格式为JSON格式  \n")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "params", value = "参数集合", paramType = "body", dataType = "Map", dataTypeClass = Map.class)
    })
    @SysLog("查看所有定时任务")
    @PostMapping("/list")
    public Result list(@RequestBody Map<String, Object> params) {
        PageBO page = scheduleJobService.queryPage(params);
        return Result.success().put("page", page);
    }


    /**
     * 方法功能描述:
     * < 定时任务信息 >
     *
     * @param jobId 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:04
     */
    @RequestMapping("/info/{jobId}")
    public Result info(@PathVariable("jobId") Long jobId) {
        ScheduleJobDTO scheduleJobDto = scheduleJobService.getById(jobId);
        return Result.success().put("schedule", scheduleJobDto);
    }


    /**
     * 方法功能描述:
     * < 保存定时任务 >
     *
     * @param scheduleJobDto 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:04
     */
    @ApiOperation(value = "保存定时任务", notes = "  \n" +
            "返回值解释:  \n" +
            "code: 0-为成功，1-为失败  \n" +
            "msg: 提示的信息  \n" +
            "data: 返回的数据，格式为JSON格式  \n")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "params", value = "定时任务对象", paramType = "body", dataType = "ScheduleJobDTO", dataTypeClass = ScheduleJobDTO.class)
    })
    @SysLog("保存定时任务")
    @PostMapping("/save")
    public Result save(@RequestBody ScheduleJobDTO scheduleJobDto) {
        ValidatorUtils.validateEntity(scheduleJobDto);
        scheduleJobService.saveJob(scheduleJobDto);
        return Result.success();
    }


    /**
     * 方法功能描述:
     * < 修改定时任务 >
     *
     * @param scheduleJobDTO 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:04
     */
    @SysLog("修改定时任务")
    @RequestMapping("/update")
    public Result update(@RequestBody ScheduleJobDTO scheduleJobDTO) {
        ValidatorUtils.validateEntity(scheduleJobDTO);
        scheduleJobService.update(scheduleJobDTO);
        return Result.success();
    }


    /**
     * 方法功能描述:
     * < 删除定时任务 >
     *
     * @param jobIds 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:04
     */
    @SysLog("删除定时任务")
    @RequestMapping("/delete")
    public Result delete(@RequestBody String[] jobIds) {
        scheduleJobService.deleteBatch(jobIds);
        return Result.success();
    }


    /**
     * 方法功能描述:
     * < 立即执行任务 >
     *
     * @param jobIds 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:05
     */
    @SysLog("立即执行任务")
    @RequestMapping("/run")
    public Result run(@RequestBody String[] jobIds) {
        scheduleJobService.run(jobIds);
        return Result.success();
    }


    /**
     * 方法功能描述:
     * < 暂停定时任务 >
     *
     * @param jobIds 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:05
     */
    @SysLog("暂停定时任务")
    @RequestMapping("/pause")
    public Result pause(@RequestBody String[] jobIds) {
        scheduleJobService.pause(jobIds);
        return Result.success();
    }


    /**
     * 方法功能描述:
     * < 恢复定时任务 >
     *
     * @param jobIds 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author YangFan
     * @date 2021-06-22 17:05
     */
    @SysLog("恢复定时任务")
    @RequestMapping("/resume")
    public Result resume(@RequestBody String[] jobIds) {
        scheduleJobService.resume(jobIds);
        return Result.success();
    }

}
